//
//  MusicTools.swift
//  MusicianPro
//
//  Created by admin on 2022/11/30.
//

import Foundation
import UIKit

extension UIButton{
    
    private struct AssociateKeys {
        static var actuibKey = "Btn+Extension+Action"
    }
    var callCom: (() -> Void)? {
        get {
            return objc_getAssociatedObject(self, &AssociateKeys.actuibKey) as? (() -> Void)
        }
        set {
            objc_setAssociatedObject(self, &AssociateKeys.actuibKey, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
    class func initV(font:UIFont = UIFont.systemFont(ofSize: 16),text:String = "",img:String,contentMent:UIControl.ContentHorizontalAlignment = .center) -> UIButton {
        let l = UIButton(frame: .zero)
        l.setImage(UIImage(named: img), for: .normal)
        l.titleLabel?.font = font
        l.setTitleColor(UIColor.white, for: .normal)
        l.setTitle(text, for: .normal)
        l.contentMode = .left
        l.contentHorizontalAlignment = contentMent
        return l
    }
    func addAct(_ com:@escaping()->Void) {
        self.callCom = com
        let sel = #selector(buttonAction)
        self.addTarget(self, action: sel, for: .touchUpInside)
    }
    @objc func buttonAction() {
        self.callCom?()
    }
}

public extension UIDevice {

    static var modelName: String {
        var systemInfo = utsname()
        uname(&systemInfo)
        let machineMirror = Mirror(reflecting: systemInfo.machine)
        let identifier = machineMirror.children.reduce("") { identifier, element in
            guard let value = element.value as? Int8, value != 0 else { return identifier }
            return identifier + String(UnicodeScalar(UInt8(value)))
        }
        switch identifier {
        case "iPod5,1":                                 return "iPod Touch 5"
        case "iPod7,1":                                 return "iPod Touch 6"
        case "iPhone3,1", "iPhone3,2", "iPhone3,3":     return "iPhone 4"
        case "iPhone4,1":                               return "iPhone 4s"
        case "iPhone5,1", "iPhone5,2":                  return "iPhone 5"
        case "iPhone5,3", "iPhone5,4":                  return "iPhone 5c"
        case "iPhone6,1", "iPhone6,2":                  return "iPhone 5s"
        case "iPhone7,2":                               return "iPhone 6"
        case "iPhone7,1":                               return "iPhone 6 Plus"
        case "iPhone8,1":                               return "iPhone 6s"
        case "iPhone8,2":                               return "iPhone 6s Plus"
        case "iPhone9,1", "iPhone9,3":                  return "iPhone 7"
        case "iPhone9,2", "iPhone9,4":                  return "iPhone 7 Plus"
        case "iPhone8,4":                               return "iPhone SE"
        case "iPhone10,1", "iPhone10,4":                return "iPhone 8"
        case "iPhone10,2", "iPhone10,5":                return "iPhone 8 Plus"
        case "iPhone10,3", "iPhone10,6":                return "iPhone X"
        case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4":return "iPad"
        case "iPad3,1", "iPad3,2", "iPad3,3":           return "iPad"
        case "iPad3,4", "iPad3,5", "iPad3,6":           return "iPad"
        case "iPad4,1", "iPad4,2", "iPad4,3":           return "iPad"
        case "iPad5,3", "iPad5,4":                      return "iPad"
        case "iPad6,11", "iPad6,12":                    return "iPad"
        case "iPad2,5", "iPad2,6", "iPad2,7":           return "iPad"
        case "iPad4,4", "iPad4,5", "iPad4,6":           return "iPad"
        case "iPad4,7", "iPad4,8", "iPad4,9":           return "iPad"
        case "iPad5,1", "iPad5,2":                      return "iPad"
        case "iPad6,3", "iPad6,4":                      return "iPad"
        case "iPad6,7", "iPad6,8":                      return "iPad"
        case "iPad7,1", "iPad7,2":                      return "iPad"
        case "iPad7,3", "iPad7,4":                      return "iPad"
        case "AppleTV5,3":                              return "Apple TV"
        case "AppleTV6,2":                              return "Apple TV 4K"
        case "AudioAccessory1,1":                       return "HomePod"
        case "i386", "x86_64":                          return "Simulator"
        default:                                        return identifier
        }
    }

}
extension UILabel{
    class func initV(_ font:UIFont,text:String = "",textColor:UIColor = UIColor.black) -> UILabel {
        let l = UILabel(frame: .zero)
        l.font = font
        l.text = text
        l.textColor = textColor
        l.numberOfLines = 0
        return l
    }
}

extension UICollectionView
{
    class func initCollect(layout:UICollectionViewLayout) -> UICollectionView {
        let tb = UICollectionView(frame: .zero, collectionViewLayout: layout)
        tb.backgroundColor = .clear
        return tb
    }
}

extension UIScrollView
{
    class func initView() -> UITableView {
        let s = UITableView(frame: .zero, style: .plain)
        s.backgroundColor = .clear
        s.separatorStyle = .none
        s.showsVerticalScrollIndicator = false
        s.showsHorizontalScrollIndicator = false
        return s
    }
}

extension UIView
{
    func setAllCorners(corner:CGFloat) -> Void {
        self.layer.masksToBounds = true
        self.layer.cornerRadius = corner
    }
}

extension String {
    func toDictionary() -> [String : Any] {
        var result = [String : Any]()
        guard !self.isEmpty else { return result }
        guard let dataSelf = self.data(using: .utf8) else {
            return result
        }
        if let dic = try? JSONSerialization.jsonObject(with: dataSelf,
                           options: .mutableContainers) as? [String : Any] {
            result = dic
        }
        return result
    }
    
    func validateEmail() -> Bool {
        if self.count == 0 {
            return false
        }
        let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
        let emailTest:NSPredicate = NSPredicate(format: "SELF MATCHES %@", emailRegex)
        return emailTest.evaluate(with: self)
    }

    func validatePassword() -> Bool {
        if self.count == 0 {
            return false
        }
        guard self.count >= 6,self.count <= 14 else {
            return false
        }
        return true
    }

}


//MARK: - UIImageView
extension UIImageView {
    
    class func initImgView(img:String) -> UIImageView {
        let l = UIImageView(frame: .zero)
        l.image = UIImage(named: img)
        l.contentMode = .scaleAspectFill
        l.clipsToBounds = true
        return l
    }

    /// 下载图片
    /// - Parameters:
    ///   - url: 图片url
    ///   - isCornerRadiu: 是否圆角
    ///   - cornerRadii: 圆角值
    ///   - placeholder: 占位图
    ///   - completionHandler: 完成回调
//    func download(_ url: URL?, placeholder: UIImage? = UIImage.image(named: "UIImg_Placeholder_Head_imageAnt"), completionHandler: ((KFCrossPlatformImage) -> Void)? = nil) {
//        assert(url != nil, "[图片下载] - [url: \(url?.absoluteString ?? "")] - [请检查图片地址]")
//        layoutIfNeeded()
//        self.kf.indicatorType = .custom(indicator: LogingProView())
//        self.kf.setImage(with: url, placeholder: placeholder)
//    }
//    
//    /// 下载图片
//    /// - Parameters:
//    ///   - urlStr: 下载地址
//    ///   - complete: 完成回调
//    static func downloadWith(urlStr: String, complete: ((UIImage?) -> ())? = nil) {
//        if let url = urlStr.toURL {
//            KingfisherManager.shared.retrieveImage(with: url) { (result) in
//                switch result {
//                case .success(let imgResult):
//                    complete?(imgResult.image)
//                case .failure(_):
//                    complete?(nil)
//                }
//            }
//        } else {
//            complete?(nil)
//        }
//    }
    
}



public extension UIApplication {
    
//    static let window = UIApplication.shared.connectedScenes
//        .filter({ $0.activationState == .foregroundActive })
//        .map({ $0 as? UIWindowScene })
//        .compactMap({ $0 })
//        .last?.windows
//        .filter({ $0.isKeyWindow })
//        .last ?? UIApplication.shared.windows.last ?? UIApplication.shared.keyWindow
    
    static let window = UIApplication.shared.keyWindow
    static func topViewController(controller: UIViewController? = window?.rootViewController) -> UIViewController? {
        if let navigationController = controller as? UINavigationController {
            return topViewController(controller: navigationController.visibleViewController)
        }
        if let tabController = controller as? UITabBarController {
            if let selected = tabController.selectedViewController {
                return topViewController(controller: selected)
            }
        }
        if let presented = controller?.presentedViewController {
            return topViewController(controller: presented)
        }
        return controller
    }
    
}


extension UIViewController{
    func imageToBase64String(image:UIImage)->Data?{
        let imageData = image.resetImgSize()
        return imageData
    }
}
